﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoGrupo5.ClasesDominio;
using System.Data.SqlClient;
using System.Data;

//20/05/2011

namespace ProyectoGrupo5.Persistencia
{
    public class CandidatoDAO : ICandidatoDAO
     {
        //Atributos
        private String cadenaConexion = "Data Source=LOCALHOST;Initial Catalog=BOLSA_TRABAJO;User Id=PRUEBA;Password=prueba;";
        private SqlConnection conexion;

        public CandidatoDAO()
        {
             conexion = new SqlConnection(cadenaConexion);
        }

        public Candidato CrearCandidato(Candidato candidato)
        {
          Candidato existeC = this.VerificaCodigoCandidato(candidato.CodigoCandidato);
          if (existeC != null)
          {
              throw new Exception("El Candidato con CODIGO " + candidato.CodigoCandidato + " ya existe!");
          }
          else
          {
              Postulante existeP = this.VerificaCodigoPostulante(candidato.Postulante.CodigoPostulante);
              if (existeP == null)
              {
                  throw new Exception("El Postulante con CODIGO " + candidato.Postulante.CodigoPostulante + " No existe!");
              }
              else
              {
               Aviso existeA = this.VerificaCodigoAviso(candidato.Aviso.CodigoAviso);
               if (existeA == null)
               {
                   throw new Exception("El Aviso con CODIGO " + candidato.Aviso.CodigoAviso + " No existe!");
               }
               else
               {
                  conexion.Open();
                   //Creamos nuestra Sentencia Insert
                   String sentencia = "Insert Into CANDIDATO Values(@cc,@ca,@es,@em,@cp);";
                   SqlCommand comando = new SqlCommand(sentencia, conexion);
                   //Agregamos nuestros parametros a nuestra consulta 
                   comando.Parameters.Add(new SqlParameter("@cc", SqlDbType.Int)).Value      = candidato.CodigoCandidato;
                   comando.Parameters.Add(new SqlParameter("@ca", SqlDbType.Int)).Value      = candidato.Aviso.CodigoAviso;
                   comando.Parameters.Add(new SqlParameter("@es", SqlDbType.NVarChar)).Value = candidato.EstadoSeleccion;
                   comando.Parameters.Add(new SqlParameter("@em", SqlDbType.NVarChar)).Value = candidato.Postulante.Correo;
                   comando.Parameters.Add(new SqlParameter("@cp", SqlDbType.Int)).Value      = candidato.Postulante.CodigoPostulante;
                   //Ejecutamos Consulta
                   comando.ExecuteNonQuery();
                   conexion.Close();
                   return this.ObtenerCandidato(candidato.CodigoCandidato); //TODO: Queda pendiente de devolver objeto creado
               }
              }
          }
        }

        public Candidato VerificaCodigoCandidato(Int32 codigo)
        {
            conexion.Open();
            String sentencia = "Select * From CANDIDATO Where CodigoCandidato=@cc";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            comando.Parameters.Add(new SqlParameter("@cc", SqlDbType.Int)).Value = codigo;
            SqlDataReader resultado = comando.ExecuteReader();
            Candidato candidato = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                candidato = new Candidato();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                candidato.CodigoCandidato = (Int32)resultado["codigocandidato"];
            }
            resultado.Close();
            conexion.Close();
            return candidato;
        }

        public Aviso VerificaCodigoAviso(Int32 codigo)
        {
            conexion.Open();
            String sentencia = "Select * From AVISO Where CodigoAviso=@ca";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            comando.Parameters.Add(new SqlParameter("@ca", SqlDbType.Int)).Value = codigo;
            SqlDataReader resultado = comando.ExecuteReader();
            Aviso aviso = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                aviso = new Aviso();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                aviso.CodigoAviso = (Int32)resultado["codigoaviso"];
            }
            resultado.Close();
            conexion.Close();
            return aviso;
        }

        public Postulante VerificaCodigoPostulante(Int32 codigo)
        {
            conexion.Open();
            String sentencia = "Select * From POSTULANTE Where CodigoPostulante=@cp";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            comando.Parameters.Add(new SqlParameter("@cp", SqlDbType.Int)).Value = codigo;
            SqlDataReader resultado = comando.ExecuteReader();
            Postulante postulante = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                postulante = new Postulante();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                postulante.CodigoPostulante = (Int32)resultado["codigopostulante"];
            }
            resultado.Close();
            conexion.Close();
            return postulante;
        }

        public Candidato ObtenerCandidato(Int32 codigo)
        {
            Candidato existeC = this.VerificaCodigoCandidato(codigo);
           if (existeC == null)
           {
               throw new Exception("El Candidato con CODIGO " + codigo + " NO existe!");
           }
           else
           {
               conexion.Open();
               Candidato candidato = new Candidato();
               Aviso aviso = new Aviso();
               candidato.Aviso = aviso;
               Postulante postulante = new Postulante();
               candidato.Postulante = postulante;

               String sentencia = "Select * From CANDIDATO Where CodigoCandidato=@cc";
               SqlCommand comando = new SqlCommand(sentencia, conexion);
               comando.Parameters.Add(new SqlParameter("@cc", SqlDbType.Int)).Value = codigo;
               SqlDataReader resultado = comando.ExecuteReader();
               if (resultado.HasRows) //Si el resultado tiene filas, llenamos el objeto
               {
                   resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                   candidato.CodigoCandidato             = (Int32)resultado["codigocandidato"];
                   candidato.Aviso.CodigoAviso           = (Int32)resultado["codigoaviso"];
                   candidato.EstadoSeleccion             = (String)resultado["estadoseleccion"];
                   candidato.Postulante.Correo           = (String)resultado["correopostulante"];
                   candidato.Postulante.CodigoPostulante = (Int32)resultado["codigopostulante"];
               }
               resultado.Close();
               conexion.Close();
               return candidato;
           }
     }

        public Candidato ModificarCandidato(Candidato candidato)
        {
            Candidato existeC = this.VerificaCodigoCandidato(candidato.CodigoCandidato);
            if (existeC == null)
            {
                throw new Exception("El Candidato con CODIGO " + candidato.CodigoCandidato + " No existe!");
            }
            else
            {
                conexion.Open();
                String sentencia = "Update CANDIDATO Set "
                + "EstadoSeleccion=@es "
                + "Where CodigoCandidato=@cc";

                SqlCommand comando = new SqlCommand(sentencia, conexion);
                //Agregamos nuestros parametros a nuestra consulta 
                comando.Parameters.Add(new SqlParameter("@cc", SqlDbType.Int)).Value      = candidato.CodigoCandidato;
                comando.Parameters.Add(new SqlParameter("@es", SqlDbType.NVarChar)).Value = candidato.EstadoSeleccion;
                //Ejecutamos Consulta
                comando.ExecuteNonQuery();
                conexion.Close();
                return this.ObtenerCandidato(candidato.CodigoCandidato); //TODO: Queda pendiente de devolver objeto creado
            }
        }

        public void EliminarCandidato(Int32 codigo)
        {
            Candidato existeC = this.VerificaCodigoCandidato(codigo);
            if (existeC == null)
            {
                throw new Exception("El Candidato con CODIGO " + codigo + " NO existe!");
            }
            else
            {
                conexion.Open();
                String sentencia = "Delete From CANDIDATO Where CodigoCandidato=@cc";
                SqlCommand comando = new SqlCommand(sentencia, conexion);
                comando.Parameters.Add(new SqlParameter("@cc", SqlDbType.Int)).Value = codigo;
                comando.ExecuteNonQuery();
                conexion.Close();
            }
        }
    }
}